home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / DDJ9205.ARJ / CHECKSUM.ASC < prev    next >
Text File  |  1992-03-30  |  3KB  |  113 lines

  1. _FLETCHER'S CHECKSUM_
  2. by John Kodis
  3.  
  4.  
  5. Example 1: 
  6.  
  7. (a)
  8.  
  9.         integer i, sum1, sum2;
  10.  
  11.         sum1 = 0;
  12.         sum2 = 0;
  13.         for i from 1 to message_length do
  14.             sum1 = ( sum1 + message[i] ) modulo 255;
  15.             sum2 = ( sum2 + sum1       ) modulo 255;
  16.         end for.
  17.  
  18.  
  19. (b)
  20.  
  21.         check1 = 255 - (( sum1 + sum2   ) modulo 255);
  22.     message[message_length+1] = check1;
  23.         check2 = 255 - (( sum1 + check1 ) modulo 255);
  24.         message[message_length+2] = check2;
  25.  
  26.  
  27.  
  28.  
  29. Example 2: 
  30.  
  31.  
  32. (a)
  33.  
  34.         register unsigned char *ptr;
  35.         register short int i, len, sum1, sum2;
  36.         
  37.         sum1 = sum2 = 0;
  38.         for (i=0; i<len; i++)
  39.             {
  40.             sum1 += *ptr++;
  41.             if (sum1 >= 255) sum1 -= 255;
  42.             sum2 += sum1;
  43.             if (sum2 >= 255) sum2 -= 255;
  44.             }
  45.         
  46.  
  47. (b)
  48.  
  49.                 moveq   #0,d5
  50.                 move.w  d5,d4   ;sum1 = sum2 = 0;
  51.                 moveq   #0,d6
  52.                 bra.s   L_29    ;for(i=0; i<len; i++) {
  53.         L_28    moveq   #0,d0
  54.                 move.b  (a3)+,d0
  55.                 add.w   d0,d4   ;  sum1 += *ptr++;
  56.                 cmp.w   #255,d4
  57.                 blt.s   L_32
  58.                 sub.w   #255,d4 ;  if(sum1 >= 255) sum1 -= 255;
  59.         L_32    add.w   d4,d5   ;  sum2 += sum1;
  60.                 cmp.w   #255,d5
  61.                 blt.s   L_36
  62.                 sub.w   #255,d5 ;  if(sum2 >= 255) sum2 -= 255;
  63.         L_36    addq.w  #1,d6
  64.         L_29    cmp.w   d7,d6
  65.                 blt.s   L_28    ;}
  66.  
  67.  
  68.  
  69. Example 3:
  70.  
  71. (a)
  72.         register unsigned char *ptr;
  73.         register short int sum1, len;
  74.         register unsigned long int sum2;
  75.         
  76.         sum1 = sum2 = 0;
  77.         while (len--)
  78.             {
  79.             sum1 += *ptr++;
  80.             if (sum1 >= 255) sum1 -= 255;
  81.             sum2 += sum1;
  82.             }
  83.         sum2 %= 255;
  84.  
  85. (b)    loop     moveq    #0,d3
  86.         move.b    (a3)+,d3
  87.         add.w    d3,d0    ; sum1 += *ptr++;
  88.  
  89.         cmp.w    #255,d0
  90.         blt.s    no sub
  91.         sub.w    #255,d0    ; if (sum1 >= 255) sum1 -= 255;
  92.         
  93.     no_sub    add.1    d0,d1    ; sum2 += sum1;
  94.         dbra    d2,loop    ; while (len--);
  95.  
  96.  
  97.  
  98. Example 4:
  99.  
  100.         ; Register         Usage
  101.     ; D0         the first checksum value (sum1)
  102.         ; D1         the second checksum value (sum2)
  103.         ; D2        the length in bytes of the buffer (len)
  104.         ; D4        contains zero, for the addx.b instructions
  105.     ; A0         pointer into the buffer (ptr)
  106.  
  107.         loop    add.b   (a0)+,d0   ; sum1 += *ptr++;
  108.                 addx.b  d4,d0      ; if (sum1 >= 256) sum1 += 1;
  109.                 add.l   d0,d1      ; sum2 += sum1;
  110.                 dbra    d2,loop    ; while (len--);
  111.  
  112.  
  113.